SICP 习题 1.6

Exercise 1.6.  Alyssa P. Hacker doesn't see why if needs to be provided as a special form. “Why can't I just define it as an ordinary procedure in terms of cond?” she asks. Alyssa's friend Eva Lu Ator claims this can indeed be done, and she defines a new version of if:

练习 1.6. Alyssa P. Hacker 不明白为什么需要将其作为特殊形式提供。她问道:​“为什么我不能将其定义为 cond 下的普通过程?​”Alyssa 的朋友 Eva Lu Ator 声称这确实可以做到,她定义了if 的一个新版本:

(define (new-if predicate then-clause else-clause)
  (cond (predicate then-clause)
	(else else-clause)))

问题的关键在于普通过程和特殊形式在求值时的行为差异:

这也展示了 Scheme/Lisp 中一个重要的概念:并不是所有看起来等价的实现都真的等价,求值顺序和求值规则会产生重要影响。


特殊形式 if 的行为

当使用内置的特殊形式 if 时,解释器会:


普通过程 new-if 的行为

作为普通过程,new-if 遵循应用序求值规则:


出问题的行为

(define (sqrt-iter guess x)
  (new-if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
		 x)))

本文作者:Maeiee

本文链接:SICP 习题 1.6

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!